'use strict';
//////////////////////////////////////////////////////////////////////////////
// 类型获取
// =====================
// liuyp 2018年12月20日11:28:08
//////////////////////////////////////////////////////////////////////////////
const type = (obj) => {
    let type = Object.prototype.toString.call(obj)
    return type.replace('[object ','').replace(']','').toLowerCase();
}
//////////////////////////////////////////////////////////////////////////////
// 简单继承
// @param s 子类
// @param f 父类
// =====================
// liuyp 2018年12月20日11:28:08
//////////////////////////////////////////////////////////////////////////////
const extend = (s, f) => {
    s = s || {}
    f = f || {}
    // Object.assign 似乎有深复制问题 不过还好我们的使用不会改动内容 不受影响
    // 他没有选择继承的功能 所以自己写个
    for(var k in f){
        if( f[k] !== undefined ){
            s[k] = f[k]
        }
    }
    return s
}
//////////////////////////////////////////////////////////////////////////////
// 反向简单继承
// @param s 子类
// @param f 父类
// =====================
// liuyp 2018年12月20日11:28:08
//////////////////////////////////////////////////////////////////////////////
const extendF = (s, f) => {
    s = s || {}
    f = f || {}
    for(var k in s){
        if( f[k] !== undefined ){
            s[k] = f[k]
        }
    }
    return s
}
//////////////////////////////////////////////////////////////////////////////
// 深度克隆
// =====================
// liuyp 2018年12月20日11:28:08
//////////////////////////////////////////////////////////////////////////////
const deepClone = (obj) => {
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象，如果是，递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是，简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}
/**
* 判断两个对象是否相等
* @param {*} obj1 对象
* @param {*} obj2 对象
* @description 这两个对象的值只能是数字或字符串
*/
const objEqual = (obj1, obj2) => {
    const keysArr1 = Object.keys(obj1)
    const keysArr2 = Object.keys(obj2)
    if (keysArr1.length === keysArr2.length) return false
    else if (keysArr1.length === 0 && keysArr2.length === 0) return true
    /* eslint-disable-next-line */
    else return !keysArr1.some(key => obj1[key] != obj2[key])
}



//////////////////////////////////////////////////////////////////////////////
// 获得url字符串中所有的参数
// =====================
// liuyp 2019年1月22日19:49:31
//////////////////////////////////////////////////////////////////////////////
const url2obj = (e) => {
    var t = {},
        r = e.substr(1 + e.indexOf("?"));
    r = r.split("&");
    for (var n = 0; n < r.length; n++) { var o = r[n].split("="); t[o[0]] = decodeURIComponent(o.slice(1).join("=")) }
    return t
}
//////////////////////////////////////////////////////////////////////////////
// 对象转换为url参数格式
// =====================
// liuyp 2019年1月22日19:49:31
//////////////////////////////////////////////////////////////////////////////
const obj2url = (url) => {
    var arr = [], en = encodeURIComponent;
    for (var name in url) { arr.push(en(name)+'='+en(url[name])) }
    return arr.join('&');
}
//////////////////////////////////////////////////////////////////////////////
// 详细解析一个url,这段代码来自腾讯空间脚本
// =====================
// liuyp 2019年1月22日19:49:31
//////////////////////////////////////////////////////////////////////////////
const urlInfo = function (c){
    var a=document.createElement('a');
    a.href=c;
    return{
        source:c,host:a.hostname,port:a.port,query:a.search,
        protocol:a.protocol.replace(':',''),
        params:(function(){
            var b={},seg=a.search.replace(/^\?/,'').split('&'),len=seg.length,i=0,s;
            for(;i<len;i++){ if(!seg[i]){continue} s=seg[i].split('='); b[s[0]]=s[1] }
            return b
        })(),
        file:(a.pathname.match(/\/([^\/?#]+)$/i)||[,''])[1],
        hash:a.hash.replace('#',''),
        path:a.pathname.replace(/^([^\/])/g,'/$1'),
        relative:(a.href.match(/tps?:\/\/[^\/]+(.+)/)||[,''])[1],
        segments:a.pathname.replace(/^\//,'').split('/')
    }
}
//////////////////////////////////////////////////////////////////////////////
// URL_添加参数
// =====================
// liuyp 2019年1月22日19:49:31
//////////////////////////////////////////////////////////////////////////////
const urlChange = function (destiny, par, par_value) {
    var pattern = par+'=([^&]*)';
    var replaceText = par+'='+par_value;
    if (destiny.match(pattern)) {
        var tmp = '/\\'+par+'=[^&]*/'; tmp = destiny.replace(eval(tmp), replaceText);
        return (tmp);
    } else {
        if (destiny.match('[\?]')) { return destiny+'&'+ replaceText; }
        else { return destiny+'?'+replaceText; }
    }
}
//////////////////////////////////////////////////////////////////////////////
// 阻止事件冒泡 防止默认行为
// =====================
// liuyp 2018年12月27日19:44:45
//////////////////////////////////////////////////////////////////////////////
const eventStop = (ev) => {
    /*IE和Chrome下是window.event FF下是e*/
    ev = ev || window.event;
    /* 防止默认行为*/
    if (ev.preventDefault) { ev.preventDefault() } else { ev.returnValue = false; }
    /* 阻止事件冒泡*/
    if (ev.stopPropagation) { ev.stopPropagation() } else { ev.cancelBubble = true; }
}
//////////////////////////////////////////////////////////////////////////////
// 事件发生的目标
// =====================
// liuyp 2018年12月27日19:44:45
//////////////////////////////////////////////////////////////////////////////
const eventTarget = (ev) => {
    ev = ev || window.event;
    /*IE和Chrome下是srcElement FF下是target*/
    return ev.target || ev.srcElement;
}
/*================================================================================*\
*  |说明|_Regexp_正则 测试 TEST
*  |说明|源头
\*================================================================================*/
const REGWXP = {
    n01: /^[\u4E00-\u9FA5]+$/g, // 纯中文
    n02: /^[\u4E00-\u9FA5\uF900-\uFA2D]+$/g, // 纯中文
    n03: /^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$/g, // 车牌号
    n04: /^[a-zA-Z]+$/g, // 大小写字母
    n05: /^[0-9]+$/g, // 数字
    n06: /^<\/?[^>]+>$/g, // 标签
    n07: /^[A-Za-z0-9](([_\.\+\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/g, // 邮箱
    n08: /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/g, // 邮箱
    n09: /^http[s]?:\/\/([\w-]+\.)+[\w-]+([\w-.\/?%&=]*)?$/g, // 网址
    n10: /^[a-zA-z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/g, // 网址
    n11: /^(13[0-9]|14[0-9]|15[0|1|2|3|5|6|7|8|9]|17[0-9]|18[0-9])\d{8}$/g, // 手机号码
    n12: /^(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)$/g, // IP地址
    n13: /^(\d+)\.(\d+)\.(\d+)\.(\d+)/g, // IP地址
    n14: /^(([0\+]\d{2,3})?-?(0\d{2,3}))?-?(\d{7,8})(-(\d{3,}))?$/g, // 区号 电话
    n15: /^\d{6}$/g, // 邮编
    n16: /^(.*)\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/g, // 图片格式
    n17: /^(.*)\.(rar|zip|7zip|tgz)$/g, // 压缩包
    n18: /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/g, // 日期格式
    n19: /^[1-9]*[1-9][0-9]$/g, // QQ
    n20: /^(h|H)(r|R)(e|E)(f|F) *= *(\'|\")?(\w|\\|\/|\.)+(\'|\"| *|>)?$/g, // href = 123
    n21: /^(s|S)(r|R)(c|C) *= *(\'|\")?(\w|\\|\/|\.)+(\'|\"| *|>)?$/g, // src = 123
    n22: /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/g, // 用户名
    end: null
}
exports = module.exports = {
    type,
    url2obj,
    obj2url,
    eventStop,
    eventTarget,
    urlInfo,
    urlChange,
    REGWXP
}